#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
#include <iomanip>
using std::setw;

double getAverage(int arr[], int size)
/* 数组 或 指针 作为函数参数*/
{
  int i, sum = 0;
  double avg;

  for (i = 0; i < size; ++i)
  {
    sum += arr[i];
  }

  avg = double(sum) / size;

  cout << "平均值是：" << avg << endl;

  return avg;
}

int *getRandom()
/* 函数返回数组 或 指针 */
{
  // C++ 不支持在函数外返回局部变量的地址，除非定义局部变量为 static 变量。
  static int r[10];

  // 设置种子
  srand((unsigned)time(NULL));
  for (int i = 0; i < 10; ++i)
  {
    r[i] = rand();
    cout << r[i] << endl;
  }

  return r;
}

void StudyArrayAndPoint()
{
  cout<<"=========="<<"一维数组的用法"<<"=========="<<endl;
  int n[5]; // n 是一个包含 10 个整数的数组

  // 初始化数组元素
  for (int i = 0; i < 5; i++)
  {
    n[i] = i + 100; // 设置元素 i 为 i + 100
  }
  cout << "Element" << setw(13) << "Value" << endl;

  // 输出数组中每个元素的值
  for (int j = 0; j < 5; j++)
  {
    cout << setw(7) << j << setw(13) << n[j] << endl;
  }

  cout<<"=========="<<"指针访问数组"<<"=========="<<endl;
  int *p;

  p = n;

  // 输出数组中每个元素的值
  cout << "使用指针的数组值 " << endl;
  for (int i = 0; i < 5; i++)
  {
    cout << "*(p + " << i << ") : ";
    cout << *(p + i) << endl;
  }

  cout<<"=========="<<"数组作为函数参数"<<"=========="<<endl;
  double tmp;
  // 传入指针作为参数
  tmp = getAverage(p, 5);
  // 传入数组首地址作为参数
  tmp = getAverage(n, 5);

  cout<<"=========="<<"函数返回数组"<<"=========="<<endl;
  // 返回的是一个指针，指向r数组的首地址
  p = getRandom();
  for (int i = 0; i < 10; i++)
  {
    cout << "*(p + " << i << ") : ";
    cout << *(p + i) << endl;
  }
}

int main()
{
  StudyArrayAndPoint();
  return 0;
}